/*
Copyright [2012] [Maria Eugenia Malagamba]
Copyright [2012] [Leandro Pellegrino]
Copyright [2012] [Julia Gambuzzi]
Copyright [2012] [Ignacio Capodanno]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/

#pragma once
#include "Pintable.h"
#include  "Bala.h"
#include  "../Bonus/Laser.h"
#include  "../Bonus/Misil.h"
#include  "../Bonus/Bomba.h"
#include  "../Bonus/Mina.h"
#include  "../Bonus/Escudo.h"
#include  "../Bonus/SuperEscudo.h"
#include <math.h>
#include "SDL.h"
#include "Energia.h"
#include "../Colisiones/Colisionador.hpp"
#include "../Bonus/ValoresParametrizablesBonus.hpp"

#define PI 3.141592653589793
#define FPS 15
using namespace std;

namespace Entidades{

	class Nave : public Colisionador
	{

	private:
		
		double velocidadDeRotacion;
		double velocidadMaxima;
		double velocidad;
		double propulsion;
		double friccion;
		int duracionBala;
		int velocidadBala;
		bool acelerando;
		Energia* energia;
		bool enReparacion;
		int ciclosEnReparacion;
		bool invisible;
		int ciclosInvisible;
		double ultimaDireccion;
		void setVelocidad(double velocidad);
		void setAcelerando(bool acelerando);
		void setEnergia(int cantidad);

		Escudo * escudo;
		SuperEscudo * superEscudo;

		ValoresParametrizablesBonus * valoresParametrizablesBonus;

		int ciclosParaReparar;

	public:
		Nave(string pathDeLaImagen, double velocidadDeRotacion, double velocidadMaxima, double propulsion, 
			double friccion, int direccionBala, int velocidadBala, int ciclosParaReparar);

		bool getAcelerando();

		double getDireccionActual();
		void setDireccionActual(double direccionActual);

		double getUltimaDireccion();

		double getVelocidadDeRotacion();
		void setVelocidadDeRotacion(double velocidadDeRotacion);

		double getVelocidadMaxima();
		void setVelocidadMaxima(double velocidadMaxima);

		double getPropulsion();
		void setPropulsion(double propulsion);

		double getFriccion();
		void setFriccion(double friccion);

		int getDuracionBala();
		void setDuracionBala(int duracionBala);

		int getVelocidadBala();
		void setVelocidadBala(int velocidadBala);

		int getCiclosEnReparacion();
		void incrementarCiclosReparacion();

		bool getEnReparacion();
		void setEnReparacion(bool enReparacion);
		int getCiclosParaReparar();

		int getCiclosInvisible();
		void incrementarCiclosInvisible();
		void resetCiclosInvisible();
		int getCiclosBonusInvisibilidad();


		bool esInvisible();
		void setInvisible(bool invisible);

		Energia* getEnergia();
		
		Escudo * agregarEscudo();
		void eliminarEscudo();
		SuperEscudo * agregarSuperEscudo();
		void eliminarSuperEscudo();
		Escudo * getEscudo();
		SuperEscudo * getSuperEscudo();

		void propulsar(float dt);
		void frenar(float dt);
		void rotar(int sentido,float dt);
		void detener();

		void morite();
		void revivite();

		Bala* disparar();
		Laser* dispararLaser();
		Misil* dispararMisil();
		Bomba* dispararBomba();
		Mina* dispararMina();
		
		void volar();
		virtual int colisionar(int danio);
		bool colisionarCon(Colisionable *otroColisionable, bool chequearEscudos = false);

		virtual ~Nave();
	};
}